<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>闭包</title>
</head>
<body>
  <h1>闭包</h1>
  <h2>为什么要有闭包？</h2>
  <!-- 1、避免变量被污染 -->
  <!-- 2、私有化 -->
  <!-- 3、保存变量，常驻内存 -->
  <!-- 4、闭包的应用场景 => 防抖、节流、库的封装(保证数据私有性) -->
  <!-- 方法里返回一个方法 -->
</body>

<script>
  let a = "张三丰"
  function fn1() {
    let b = 1
    console.log(a)
  }

  // console.log(b)
  // fn1()

  // AO => Active Object
  (function() {
    let a = 2
    let b = 3
    function a() {
      return {
        a
      }
    }
  })()

  /**
   * Java中我们可以 private 来修饰类里面的变量变成私有的，
   * 但是js没有这个东西，所以我们需要用闭包来实现一个函数或类里的私有变量，不然外部访问
   **/
  // 闭包应用 => 处理私有数据
  let mackCounter = function() {
    let privateCounter = 0;
    function changeBy(val) {
      privateCounter += val
    }

    return {
      increment: function() {
        changeBy(1)
      },
      decrement: function() {
        changeBy(-1)
      },
      value: function() {
        return privateCounter
      }
    }
  }

  let c1 = mackCounter();
  c1.increment()
  c1.increment()
  console.log(c1.value);

  // c1.changeBy()
</script>
</html>